package com.evan.idempotent.aspect;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.concurrent.TimeUnit;

/**
 * @Description: 幂等注解
 * @Author liudeguang
 */
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Idempotent {

    /**
     * 锁的名称，唯一性（默认为方法名）
     *
     * @return
     */
    String lockName() default "";

    /**
     * SPEL表达式，获取幂等Key，默认会从线程上下文中获取框架提供的幂等ID
     *
     * @return
     */
    String spelKey() default "";

    /**
     * 存储过期时间
     *
     * @return
     */
    long storgeExpireTime() default 10;

    /**
     * 锁的过期时间
     *
     * @return
     */
    long lockExpireTime() default 10;

    /**
     * 存储时间单位
     *
     * @return
     */
    TimeUnit timeUnit() default TimeUnit.SECONDS;

    /**
     * 触发幂等限制时调用同类中的方法进行后续处理
     * 也就是幂等拦截了的处理
     *
     * @return
     */
    String idempotentHandler() default "";

    /**
     * 触发幂等限制时调用其他类中的方法进行后续处理
     *
     * @return
     */
    Class<?>[] idempotentHandlerClass() default {};
}
